package algo3.tp1.ejercicios;

import java.util.Iterator;

public class Juego {
	private int filas, columnas;
	private boolean[][] hayFicha;
	private int fichasNegras, fichasBlancas;
	
	public Juego(boolean[][] matriz) {
		this.filas = matriz.length;
		this.columnas = matriz[0].length;
	
		this.hayFicha = new boolean[this.filas][this.columnas];
		this.fichasNegras = this.fichasBlancas = 0;
		
		for (int i = 0; i < matriz.length; i++) {
			for (int j = 0; j < matriz[i].length; j++) {
				this.hayFicha[i][j] = matriz[i][j];
				
				if (matriz[i][j]) {				

					if((i + j) % 2 == 0){
						this.fichasNegras++;
					}else{
						this.fichasBlancas++;
					}
					
				}
			}
		}
	}

	public Juego(int filas, int columnas, Posicion[] fichas) {
		this.filas = filas;
		this.columnas = columnas;
		this.hayFicha = new boolean[filas][columnas];
		this.fichasBlancas = this.fichasNegras = 0;
		
		for (int i = 0; i < filas; i++) {
			for (int j = 0; j < columnas; j++) {
				this.hayFicha[i][j] = false;
			}
		}

		for (Posicion p : fichas) {
			if((p.dameFila() + p.dameColumna()) % 2 == 0){
				this.fichasNegras++;
			}else{
				this.fichasBlancas++;
			}
			
			this.hayFicha[p.dameFila()][p.dameColumna()] = true;
		}
	}
	
	public void quitarFicha(Posicion p){
		this.hayFicha[p.dameFila()][p.dameColumna()] = false;
		
		if((p.dameFila() + p.dameColumna()) % 2 == 0){
			this.fichasNegras--;
		}else{
			this.fichasBlancas--;
		}
	}
	
	public void agregarFicha(Posicion p){
		this.hayFicha[p.dameFila()][p.dameColumna()] = true;
		
		if((p.dameFila() + p.dameColumna()) % 2 == 0){
			this.fichasNegras++;
		}else{
			this.fichasBlancas++;
		}
	}
	
	public int fichasNegras(){
		return this.fichasNegras;
	}
	
	public int fichasBlancas(){
		return this.fichasBlancas;
	}
	
	public int contarFichas() {
		return this.fichasNegras + this.fichasBlancas;
	}

	public boolean hayFicha(Posicion casilla) {
		return this.hayFicha[casilla.dameFila()][casilla.dameColumna()];
	}

	public boolean esCasilla(Posicion p) {
		int fila = p.dameFila(), columna = p.dameColumna();
		return fila >= 0 && fila < filas && columna >= 0 && columna < columnas;
	}

	public class IteradorCasilla implements Iterator<Posicion>,
			Iterable<Posicion> {
		private int fila, columna;

		public IteradorCasilla() {
			fila = columna = 0;
		}

		public boolean hasNext() {
			return fila < filas;
		}

		public Posicion next() {
			Posicion p = new Posicion(fila,columna);
			columna++;
			if (columna == columnas) {
				fila++;
				columna = 0;
			}
			return p;
		}

		public Iterator<Posicion> iterator() {
			return this;
		}

		// REMOVE NO SE USA
		public void remove() {
		}
	}

	public IteradorCasilla casillas() {
		return new IteradorCasilla();
	}
}